package 中等.枚举;

import java.util.ArrayList;
import java.util.List;

/**
 * 我们有一些二维坐标，如 "(1, 3)" 或 "(2, 0.5)"，然后我们移除所有逗号，
 * 小数点和空格，得到一个字符串S。返回所有可能的原始字符串到一个列表中。
 * 原始的坐标表示法不会存在多余的零，所以不会出现类似于"00", "0.0", "0.00",
 * "1.0", "001", "00.01"或一些其他更小的数来表示坐标。此外，一个小数点前
 * 至少存在一个数，所以也不会出现“.1”形式的数字。
 * 最后返回的列表可以是任意顺序的。而且注意返回的两个数字中间（逗号之后）都有一个空格。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/ambiguous-coordinates
 */
public class 模糊坐标_816 {

    public static void main(String[] args) {

        System.out.println(new 模糊坐标_816().ambiguousCoordinates("(100)"));

    }

    /**
     * 遍历枚举
     *
     * @param s
     * @return
     */
    public List<String> ambiguousCoordinates(String s) {
        List<String> list = new ArrayList<>();
        s = s.substring(1, s.length() - 1);

        for (int i = 1; i < s.length(); i++) {
            String beforeNum = s.substring(0, i);
            String afterNum = s.substring(i);

            // 判断两个数字都是整数的情况
            if (isInt(beforeNum) && isInt(afterNum)) {
                list.add("(" + beforeNum + ", " + afterNum + ")");
            }

            for (int j = 1; j <= beforeNum.length(); j++) {
                String part1 = beforeNum.substring(0, j);
                String part2 = beforeNum.substring(j);
                if (isDouble(part1, part2)) {
                    for (int r = 1; r <= afterNum.length(); r++) {
                        String part3 = afterNum.substring(0, r);
                        String part4 = afterNum.substring(r);
                        if (isDouble(part3, part4)) {
                            // 排除两个数字都是整数的情况
                            if ("".equals(part2) && "".equals(part4)) {
                                continue;
                            }

                            StringBuilder builder = new StringBuilder();
                            builder.append("(")
                                    .append(part1);
                            if (!"".equals(part2)) {
                                builder.append(".")
                                        .append(part2);
                            }
                            builder.append(", ")
                                    .append(part3);
                            if (!"".equals(part4)) {
                                builder.append(".")
                                        .append(part4);
                            }
                            builder.append(")");
                            list.add(builder.toString());
                        }
                    }
                }
            }
        }
        return list;
    }

    // 小数点前部分超过两位数，不能以 0 开头
    // 小数点后部分，不能以 0 结尾
    private boolean isDouble(String part1, String part2) {
        return (part1.length() == 1 || !part1.startsWith("0")) && !part2.endsWith("0");
    }

    // 超过两位数正数不能以 0 开头
    private boolean isInt(String numStr) {
        return numStr.length() == 1 || numStr.charAt(0) != '0';
    }

}
